home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / mods / makers / octamedv4_dev.lha / ProPlayer / reloc.a < prev    next >
Encoding:
Text File  |  1993-06-15  |  4.2 KB  |  153 lines

  1. ; © Fully Copyrighted
  2. ; Small reloc routine for those who include the module directly in
  3. ; the program code.
  4.  
  5. ; NOTE: THE MODULE POINTER IS PASSED IN STACK, SO THIS IS COMPATIBLE
  6. ;       WITH C-PROGRAMS.
  7.  
  8.         SECTION "text",code
  9.  
  10.         XDEF    _RelocModule,_RelocModule_r
  11.  
  12. mmd_songinfo    EQU 8
  13. mmd_blockarr    EQU 16
  14. mmd_expdata EQU 32
  15. msng_numblocks  EQU 504
  16. msng_pseqs  EQU 508
  17. msng_numsamples EQU 787
  18.  
  19. reloci      move.l  24(a2),d0
  20.         beq.s   xloci
  21.         movea.l d0,a0
  22.         moveq   #0,d0
  23.         move.b  msng_numsamples(a1),d0  ;number of samples
  24.         subq.b  #1,d0
  25. relocs      bsr.s   relocentr
  26.         move.l  -4(a0),d3   ;sample ptr
  27.         beq.s   nosyn
  28.         move.l  d3,a3
  29.         tst.w   4(a3)
  30.         bpl.s   nosyn       ;type >= 0
  31.         move.w  20(a3),d2   ;number of waveforms
  32.         lea 278(a3),a3  ;ptr to wf ptrs
  33.         subq.w  #1,d2
  34. relsyn      add.l   d3,(a3)+
  35.         dbf d2,relsyn
  36. nosyn       dbf     d0,relocs
  37. xloci       rts
  38. norel       addq.l  #4,a0
  39.         rts
  40. relocentr   tst.l   (a0)
  41.         beq.s   norel
  42.         add.l   d1,(a0)+
  43.         rts
  44. _RelocModule:
  45.         move.l  4(sp),a0    ;get module pointer from stack
  46. _RelocModule_r  movem.l a2-a3/d2-d3,-(sp)
  47.         movea.l a0,a2
  48.         move.l  a2,d1       ;d1 = ptr to start of module
  49.         bsr.s   relocp
  50.         movea.l mmd_songinfo(a2),a1
  51.         bsr.s   reloci
  52. rel_lp      bsr.s   relocb
  53.         cmp.b   #'2',3(a2)  ;MMD2?
  54.         bne.s   norelmmd2
  55.         bsr.w   relocmmd2sng
  56. norelmmd2   move.l  mmd_expdata(a2),d0  ;extension struct
  57.         beq.s   rel_ex
  58.         move.l  d0,a0
  59.         bsr.s   relocentr   ;ptr to next module
  60.         bsr.s   relocentr   ;InstrExt...
  61.         addq.l  #4,a0       ;skip sizes of InstrExt
  62. ; We reloc the pointers of MMD0exp, so anybody who needs them can easily
  63. ; read them.
  64.         bsr.s   relocentr   ;annotxt
  65.         addq.l  #4,a0       ;annolen
  66.         bsr.s   relocentr   ;InstrInfo
  67.         addq.l  #8,a0
  68.         bsr.s   relocentr   ;rgbtable (not useful for most people)
  69.         addq.l  #4,a0       ;skip channelsplit
  70.         bsr.s   relocentr   ;NotationInfo
  71.         bsr.s   relocentr   ;songname
  72.         addq.l  #4,a0       ;skip song name length
  73.         bsr.s   relocentr   ;MIDI dumps
  74.         bsr.s   relocmdd
  75.         move.l  d0,a0
  76.         move.l  (a0),d0
  77.         beq.s   rel_ex
  78.         move.l  d0,a2
  79.         bsr.s   relocp
  80.         movea.l 8(a2),a1
  81.         bra.s   rel_lp
  82. rel_ex      movem.l (sp)+,d2-d3/a2-a3
  83.         rts
  84.  
  85. relocp      lea mmd_songinfo(a2),a0
  86.         bsr.s   relocentr
  87.         addq.l  #4,a0
  88.         bsr.s   relocentr
  89.         addq.l  #4,a0
  90.         bsr.s   relocentr
  91.         addq.l  #4,a0
  92.         bra.s   relocentr
  93.  
  94. relocb      move.l  mmd_blockarr(a2),d0
  95.         beq.s   xlocb
  96.         movea.l d0,a0
  97.         move.w  msng_numblocks(a1),d0
  98.         subq.b  #1,d0
  99. rebl        bsr relocentr
  100.         dbf     d0,rebl
  101.         cmp.b   #'T',3(a2)  ;MMD0 (= MCNT)
  102.         beq.s   xlocb
  103.         cmp.b   #'1',3(a2)  ;test MMD type
  104.         bge.s   relocbi
  105. xlocb       rts
  106.  
  107. relocmdd    tst.l   -(a0)
  108.         beq.s   xlocmdd
  109.         movea.l (a0),a0
  110.         move.w  (a0),d0     ;# of msg dumps
  111.         addq.l  #8,a0
  112. mddloop     beq.s   xlocmdd
  113.         bsr relocentr
  114.         bsr.s   relocdmp
  115.         subq.w  #1,d0
  116.         bra.s   mddloop
  117. xlocmdd     rts
  118.  
  119. relocdmp    move.l  -4(a0),d3
  120.         beq.s   xlocdmp
  121.         exg.l   a0,d3       ;save
  122.         addq.l  #4,a0
  123.         bsr relocentr   ;reloc data pointer
  124.         move.l  d3,a0       ;restore
  125. xlocdmp     rts
  126.  
  127. relocbi     move.w  msng_numblocks(a1),d0
  128.         move.l  a0,a3
  129. biloop      subq.w  #1,d0
  130.         bmi.s   xlocdmp
  131.         move.l  -(a3),a0
  132.         addq.l  #4,a0
  133.         bsr relocentr   ;BlockInfo ptr
  134.         tst.l   -(a0)
  135.         beq.s   biloop
  136.         move.l  (a0),a0
  137.         bsr relocentr   ;hldata
  138.         bsr relocentr   ;block name
  139.         bra.s   biloop
  140. ; take care of the new features of MMD2s
  141. relocmmd2sng    move.l  mmd_songinfo(a2),a0
  142.         lea msng_pseqs(a0),a0
  143.         bsr relocentr   ;playseqtable
  144.         bsr relocentr   ;sectiontable
  145.         bsr relocentr   ;trackvols
  146.         move.w  2(a0),d0    ;numpseqs
  147.         move.l  -12(a0),a0  ;get back to playseqtable
  148.         subq.w  #1,d0
  149. psqtblloop  bsr relocentr
  150.         dbf d0,psqtblloop
  151.         rts
  152.  
  153.         END